home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib25 / bzero.cpp < prev    next >
C/C++ Source or Header  |  1992-12-12  |  2KB  |  117 lines

  1. |    new version of bcopy and memset
  2. |    uses movem to set 256 bytes blocks faster.
  3. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  4. |    sortof inspired by jrbs bcopy
  5. |    has to be preprocessed (int parameter in memset)
  6.  
  7.     .text
  8.     .even
  9.     .globl _bzero
  10.     .globl __bzero
  11.     .globl _memset
  12.  
  13. |    void *memset( void *dest, int val, size_t len );
  14. |    returns dest
  15. |    two versions for 16/32 bits
  16.  
  17. _memset:
  18.     movl    sp@(4),a0    | dest
  19. #ifdef __MSHORT__
  20.     movb    sp@(9),d0    | value
  21.     movl    sp@(10),d1    | length
  22. #else
  23.     movb    sp@(11),d0    | value
  24.     movl    sp@(12),d1    | length
  25. #endif
  26.     jeq    exit        | length==0? (size_t)
  27.     jra    do_set
  28.  
  29. |    void bzero( void *dest, size_t length );
  30. |    void _bzero( void *dest, size_t length );
  31. |    return value not used (returns dest)
  32.  
  33. _bzero:
  34. __bzero:
  35.     movl    sp@(4),a0    | dest
  36.     movl    sp@(8),d1    | length
  37.     jeq    exit        | length==0? (size_t)
  38.     clrb    d0        | value
  39.  
  40. do_set:             | a0 dest, d0.b byte, d1.l length
  41.     movel    d2,sp@-
  42.  
  43.     addl    d1,a0        | a0 points to end of area, needed for predec
  44.  
  45.     movw    a0,d2        | test for alignment
  46.     btst    #0,d2        | odd ?
  47.     jeq    even
  48.     movb    d0,a0@-     | set one byte, now we are even
  49.     subql    #1,d1
  50. even:
  51.     movb    d0,d2
  52.     lslw    #8,d0
  53.     movb    d2,d0
  54.     movw    d0,d2
  55.     swap    d2
  56.     movw    d0,d2        | d2 has byte now four times
  57.  
  58.     clrw    d0        | save length less 256
  59.     movb    d1,d0
  60.     lsrl    #8,d1        | number of 256 bytes blocks
  61.     jeq    less256
  62.     movml    d0/d3-d7/a2/a3/a5/a6,sp@-    | d2 is already saved
  63.                 | exclude a4 because of -mbaserel
  64.     movl    d2,d0
  65.     movl    d2,d3
  66.     movl    d2,d4
  67.     movl    d2,d5
  68.     movl    d2,d6
  69.     movl    d2,d7
  70.     movl    d2,a2
  71.     movl    d2,a3
  72.     movl    d2,a5
  73.     movl    d2,a6
  74. set256:
  75.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-    | set 5*44+36=256 bytes
  76.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  77.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  78.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  79.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  80.     movml    d0/d2-d7/a2-a3,a0@-
  81.     subql    #1,d1
  82.     jne    set256            | next, please
  83.     movml    sp@+,d0/d3-d7/a2/a3/a5/a6
  84. less256:            | set 16 bytes blocks
  85.     movw    d0,sp@-     | save length below 256 for last 3 bytes
  86.     lsrw    #2,d0        | number of 4 bytes blocks
  87.     jeq    less4        | less that 4 bytes left
  88.     movw    d0,d1
  89.     negw    d1
  90.     andw    #3,d1        | d1 = number of bytes below 16 (-n)&3
  91.     subqw    #1,d0
  92.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d1==0
  93.     addw    d1,d1        | offset in code (movl two bytes)
  94.     jmp    pc@(2,d1:w)    | jmp into loop
  95. set16:
  96.     movl    d2,a0@-
  97.     movl    d2,a0@-
  98.     movl    d2,a0@-
  99.     movl    d2,a0@-
  100.     dbra    d0,set16
  101. less4:
  102.     movw    sp@+,d0
  103.     btst    #1,d0
  104.     jeq    less2
  105.     movw    d2,a0@-
  106. less2:
  107.     btst    #0,d0
  108.     jeq    none
  109.     movb    d2,a0@-
  110. none:
  111. exit_d2:
  112.     movl    sp@+,d2
  113. exit:
  114.     movl sp@(4),d0        | return dest (for memset only)
  115.     rts
  116.  
  117.